/**
 * 普通的函数
 * 箭头函数
 * 一旦传递了参数，参数必须要有类型的
 * 如果有返回值，我们可以指定返回值，也可以根据返回值推出它的类型
 */
// 普通的函数
function add (x: number, y: number) {
  // return x + y
  return 'abc'
}

const result = add(1, 2)
console.log('---result---', result)

// 箭头函数
/**
const add2 = (x: number, y: number): number => {
  return x + y
}
 */

// 对于自定义函数类型来说，返回值是通过 => 指定的
type CustomFn = (x: number, y: number) => number
// 如果加了类型约束，我们的实现是可以省略的，当然也可以写全
const add2: CustomFn = (x, y) => {
  return x + y
}

const result2 = add2(2, 2)
console.log('---result2---', result2)

// 函数没有返回值
/**
 * 如果一个函数，没有返回值，它的返回值类型可以不写，如果写，写上:void
 * @param name
 */
function printName (name: string): void {}

// void和undefined不一样，如果是undefined一定要指明
function printName2 (name: string): undefined {
  return undefined
}

function slice (x?: number, y?: number) {}

slice()
slice(1)
slice(2, 3)

export {}
